#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
struct producto {
	string codigo;
	string descripcion;
	double precio;
	int cantidadDisponible;
};
int mostrarmenu();
void agregarproducto(struct producto vecp[],int &cantidad);
void mostrarproducto(struct producto vecp[],int cantidad);
void modificarproducto(struct producto vecp[],int cantidad);
void buscarproducto(struct producto vecp[],int cantidad);
void venderproducto(struct producto vecp[],int cantidad);
void productomascaro(struct producto vecp[],int cantidad);
void productonodisponible(struct producto vecp[],int cantidad);
void ordenarxprecio(struct producto vecp[],int cantidad);
int buscarcodigo(struct producto vecp[],int cantidad);
void guardarvector (struct producto vecp[], int cantidad);
void cargarvector (struct producto vecp[],int &cantidad);

int main()
{

    struct producto vecp[100];
    int cantidad,opcion;
    cantidad=0;
    cargarvector(vecp,cantidad);
    opcion=mostrarmenu();

    while(opcion!=9)
    {
        switch (opcion)
		{
			case 1:
                if(cantidad<100)
                {
                    agregarproducto(vecp,cantidad);

                }else
                {
                    cout<<"Ya puso el maximo de productos";
                }

				break;
            case 2:
                mostrarproducto(vecp,cantidad);
                break;
            case 3:
                modificarproducto(vecp,cantidad);
                break;
            case 4:
                buscarproducto(vecp,cantidad);
                break;
            case 5:
                venderproducto(vecp,cantidad);
                break;
            case 6:
                productomascaro(vecp,cantidad);
                break;
            case 7:
                productonodisponible(vecp,cantidad);
                break;
            case 8:
                ordenarxprecio(vecp,cantidad);
                break;
		}
    opcion=mostrarmenu();
    }
    guardarvector(vecp,cantidad);
    return 1;

}
int mostrarmenu()
{
    int op;
    cout<<"1.Agregar Producto"<<endl;
    cout<<"2.Mostrar Productos"<<endl;
    cout<<"3.Modificar Producto"<<endl;
    cout<<"4.Buscar Producto por Codigo"<<endl;
    cout<<"5.Vender Producto"<<endl;
    cout<<"6.Producto mas Caro"<<endl;
    cout<<"7.Productos no Disponibles"<<endl;
    cout<<"8.Ordenar Productos x Precio"<<endl;
    cout<<"9.Salir"<<endl;

    cin>>op;

    return op;
}

void agregarproducto(struct producto vecp[],int &cantidad)
{
    int i;
    i=0;
    string codigo;
    cout<<"Agregue el codigo del producto:";
    cin>>vecp[cantidad].codigo;
    while(i<cantidad)
    {
        codigo=vecp[i].codigo;
        if(vecp[cantidad].codigo==codigo)
        {
            cout<<"Codigo Incorrecto.Ya se encuentra"<<endl;
            return;
        }
        i++;
    }
        cout<<endl<<"Agregue la descripcion del producto:";cin>>vecp[cantidad].descripcion;
        cout<<endl<<"Agregue el precio producto:$";cin>>vecp[cantidad].precio;
        cout<<endl<<"Agregue el stock disponible del producto:";cin>>vecp[cantidad].cantidadDisponible;


    cantidad ++;

}

void mostrarproducto(struct producto vecp[],int cantidad)
{
    int i;
    i=0;
    while(i<cantidad)
    {
        cout<<"CODIGO"<<endl;
        cout<<vecp[i].codigo<<endl<<endl;
        cout<<"DESCRIPCION:"<<endl;
        cout<<vecp[i].descripcion<<endl<<endl;
        cout<<"PRECIO"<<endl;
        cout<<vecp[i].precio<<endl<<endl;
        cout<<"CANTIDAD DISPONIBLE"<<endl;
        cout<<vecp[i].cantidadDisponible<<endl<<endl;



        i++;
    }
}

void modificarproducto(struct producto vecp[],int cantidad)
{
        int i;
        i=buscarcodigo(vecp,cantidad);
        if(i==-1)
        {
            return;
        }
        cout<<"Cambie la descripcion del producto"<<endl;
        cin>>vecp[i].descripcion;
        cout<<"Cambie el precio del producto"<<endl;
        cin>>vecp[i].precio;
        cout<<"Cambie el Stock del producto"<<endl;
        cin>>vecp[i].cantidadDisponible;
}

void buscarproducto(struct producto vecp[],int cantidad)
{   int i;
    i=buscarcodigo(vecp,cantidad);
    if(i==-1)
    {
        return;
    }
    cout<<"DESCRIPCION:"<<vecp[i].descripcion<<endl;
    cout<<"PRECIO:$"<<vecp[i].precio<<endl;
    cout<<"STOCK:"<<vecp[i].cantidadDisponible<<endl;
}

void venderproducto(struct producto vecp[],int cantidad)
{
    int i,cantvender,precio;
    i=buscarcodigo(vecp,cantidad);
    if(i==-1)
    {
        return;
    }
    cout<<"Ingrese la cantidad que desea comprar:";
    cin>>cantvender;
    cout<<" Unidades"<<endl;
    if(cantvender<=vecp[i].cantidadDisponible)
    {
        vecp[i].cantidadDisponible=vecp[i].cantidadDisponible-cantvender;
        precio=vecp[i].precio*cantvender;
        cout<<"Cantidad restante:"<<vecp[i].cantidadDisponible<<"unidades"<<endl;
        cout<<"Precio total:$"<<precio<<endl;
    }else
    {
        cout<<"No hay unidades disponibles"<<endl;
    }
}
void productomascaro(struct producto vecp[],int cantidad)
{
    string promascaro;
    int precio,i;
    i=0;
    promascaro=vecp[i].codigo;
    precio=vecp[i].precio;
    i=1;
    while(i<cantidad)
    {
        if(precio<vecp[i].precio)
        {
            promascaro=vecp[i].codigo;
            precio=vecp[i].precio;
        }
        i++;
    }

    cout<<"Producto mas caro"<<endl<<"Codigo:"<<promascaro<<endl<<"Precio:$"<<precio;

}

void productonodisponible(struct producto vecp[],int cantidad)
{
    int i;
    i=0;
    while(i<cantidad)
    {
        if(vecp[i].cantidadDisponible==0)
        {
            cout<<"El producto con el codigo "<<vecp[i].codigo<<" no esta disponible"<<endl;
        }
        i++;
    }
}

void ordenarxprecio(struct producto vecp[],int cantidad)
{
    int flag,i,j;
    struct producto aux;

    for(j=0;j<cantidad;j++)
    {
        cout<<"hola";
        flag=1;
        for(i=0;i<cantidad-1;i++)
        {
            cout<<"hola2";
            if(vecp[i].precio>vecp[i+1].precio)
            {
                flag=0;
                aux=vecp[i];
                vecp[i]=vecp[i+1];
                vecp[i+1]=aux;
            }

        }
        if (flag==1)
        {
            break;
        }
    }
    mostrarproducto(vecp,cantidad);

}


int buscarcodigo(struct producto vecp[],int cantidad)
{
    string codigo;
    int i;
    i=0;
    cout<<"Ingrese codigo para buscar su producto"<<endl;
    cin>>codigo;
    while(i<cantidad)
    {
        if(codigo==vecp[i].codigo)
        {
            return i;
        }
        i++;
    }
    return -1;

}

void guardarvector (struct producto vecp[], int cantidad)
{
    ofstream arch("Productos.algo");
    int i;
    i=0;


    for (i=0;i<cantidad;i++)
    {
        arch<<vecp[i].codigo<<";"<<vecp[i].descripcion<<";"<<vecp[i].precio<<";"<<vecp[i].cantidadDisponible<<endl;

    }
    arch.close();
    return;
}
void cargarvector (struct producto vecp[],int &cantidad)
{
    ifstream arch("Productos.algo");
    string linea;
    int pos1,pos2,pos3;
    while(getline(arch,linea))
    {
        pos1=linea.find_first_of(';');
        vecp[cantidad].codigo=linea.substr(0,pos1);

        pos2=linea.find(';',pos1+1);
        vecp[cantidad].descripcion=linea.substr(pos1+1,pos2-pos1-1);

        pos3=linea.find(';',pos2+1);
        vecp[cantidad].precio=atof(linea.substr(pos2+1,pos3-pos2-1).c_str());
        vecp[cantidad].cantidadDisponible=atoi(linea.substr(pos3+1,linea.length()-pos3-1).c_str());
        cantidad++;
    }
}

